﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<assert.h>

//int main()
//{
//	unsigned char a = 200;
//	unsigned char b = 100;
//	unsigned char c = 0;
//	c = a + b;
//	printf("%d %d", a + b, c);
//	return 0;
//}

//
//写一个函数判断当前机器是大端还是小端，如果是小端返回1，如果是大端返回0.

//int judge()
//{
//	int ret = 1;
//	char* pc = (char*)&ret;//创建一个char*指针，取出ret的地址，并转化为char*类型
//	if (*pc == 1)
//	{
//		return 1;
//	}
//	else
//	{
//		return 0;
//	}
//}
//
//int main()
//{
//	int ret = judge();
//	if (ret == 1)
//	{
//		printf("小端\n");
//	}
//	else
//	{
//		printf("大端\n");
//	}
//
//	return 0;
//}
//
//模拟实现strncpy


//char* my_strncpy(char* dest, const char* sour, size_t num)
//{
//	char* str = dest;//记录初始地址，以便返回
//	
//	while (num)
//	{
//		if (*sour != '\0')
//		{
//			*dest++ = *sour++;
//		}
//		else
//		{
//			*dest = '0';//当num大于sour的数量时，拷贝‘0’
//		}
//		num--;
//	}
//	return str;
//}
//
//int main()
//{
//	char arr1[20] = "abc";
//	char arr2[] = "abcdefg";
//	my_strncpy(arr1, arr2, 4);
//	printf("%s\n", arr1);
//	return 0;
//}


//模拟实现strncat

// char* my_strncat(char* dest, const char* sour, size_t num)
//{
//	 char* ret = dest;
//	 
//	 while (*dest != '\0')
//	 {
//		 dest++;
//	 }
//	 while (num)
//	 {
//		 if (*sour == '\0')//当num大于sour的元素个数
//		 {
//			 *dest = '\0';//直接让*dest为0，然后返回'\0'
//			 return ret;
//		 }
//		 else
//		 {
//			 *dest++ = *sour++;
//		 }
//		 num--;
//	 }
//	 return ret;
//}
//
//
//int main()
//{
//	char arr1[20] = "abc";
//	char arr2[] = "abcdefg";
//	my_strncat(arr1, arr2, 4);
//	printf("%s\n", arr1);
//	return 0;
//}


//模拟实现memcpy
// void * memcpy ( void * destination, const void * source, size_t num );
//函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。

//void* my_memcpy(void* dest, const void* sour, size_t num)
//{
//	void* ret = dest;//方便返回起始地址
//	assert(dest && sour);//判断是否为空指针
//	while (num)
//	{
//		*(char*)dest = *(char*)sour;//因为因为要一字节一字节复制，所以要转化为char*类型
//		dest = (char*)dest + 1;//强制类型转化不是永久的
//		sour = (char*)sour + 1;
//		num--;
//	}
//	return ret;
//}
//
//
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[10] = { 0 };
//	my_memcpy(arr2, arr1, 40);
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}


//模拟实现memmove
//memmove函数处理的源内存块和⽬标内存块是可以重叠的。

void* my_memmove(void* dest, const void* sour, size_t num)
{
	void* ret = dest;
	assert(dest && sour);
	if (dest > sour)//判断首元素地址大小，需要从前向后拷贝
	{
		while (num)
		{
			*(char*)dest = *(char*)sour;
			dest = (char*)dest + 1;
			sour = (char*)sour + 1;
			num--;
		}
		return ret;
	}
	else//从后向前拷贝
	{
		dest = (char*)dest + num - 1;//char*类型指针加上num-1就等于第num个字节的地址
		sour = (char*)sour + num - 1;
		while (num)
		{
			*(char*)dest = *(char*)sour;
			dest = (char*)dest - 1;
			sour = (char*)sour - 1;
			num--;
		}
		return ret;
	}
}


int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int arr2[20] = { 0 };
	my_memmove(arr2, arr1, 40);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
}